package com.ocean.system.task;

import com.ocean.common.utils.StringUtils;

import com.ocean.system.domain.SysFTPConfigLeftJoinUser;
import com.ocean.system.domain.SysFTPLogftp;
import com.ocean.system.domain.SysFileTimedDel;
import com.ocean.system.mapper.SysPostMapper;
import com.ocean.system.multithreading.DownloadFileTask;
import com.ocean.system.multithreading.DownloadFileTaskTwo;
import com.ocean.system.multithreading.PageUtil;
import com.ocean.system.service.ISysFileTimedDelService;
import com.ocean.system.utils.DeleteExpiredFile;
import com.ocean.system.utils.FTPUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @Author: FuGui Wang
 * @Description: 定时任务：自动生成排查清单
 * @Configuration 1.主要用于标记配置类，兼备Component的效果。
 * @EnableScheduling 2.开启定时任务,可以加在启动类上
 * @Date 2023/3/10
 * @Version V1.1.0
 */
@Configuration
@Slf4j
public class ScheduledUploadFTP {

    @Autowired
    private SysPostMapper postMapper;

    @Autowired
    private FTPUtil ftpUtil;

    @Autowired
    private ISysFileTimedDelService iSysFileTimedDelService;

    /**
     * 一.定时检查产品数据，并且推送到FTP账号（不包含压缩包）
     */
    @Scheduled(cron = "0 */5 * * * ?") //每分钟执行
    //@Scheduled(cron = " */10 * * * * *")
    public void ScheduledUploadFileFTPNOPackage() {
        log.info("每5分钟定时传输FTP数据(不包含压缩包)-开始");
        try {
            List<SysFTPConfigLeftJoinUser> sysFTPConfigLeftJoinUsers = postMapper.selectDownOrderByDateNOPackage();
            // 传输数据
            allocationNOPackage(sysFTPConfigLeftJoinUsers,1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("每5分钟定时传输FTP数据(不包含压缩包)-结束");
    }

    /**
     * 二.定时检查产品数据，并且推送到FTP账号上（只包含压缩包）
     */
    @Scheduled(cron = "0 */10 * * * ?") //每10分钟执行
    //@Scheduled(cron = "*/10 * * * * *")
    public void ScheduledUploadFileFTPPackage() {
        log.info("每10分钟定时传输FTP数据(只包含压缩包)-开始");
        try {
            List<SysFTPConfigLeftJoinUser> sysFTPConfigLeftJoinUsers = postMapper.selectDownOrderByDatePackage();
            // 传输数据
            allocationNOPackage(sysFTPConfigLeftJoinUsers,1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("每10分钟定时传输FTP数据(只包含压缩包)-结束");
    }

    /**
     * 三.断点续传（主要针对上传失败的数据）
     */
    @Scheduled(cron = "0 */30 * * * ?") //每30分钟执行
    public void ScheduledUploadFileFTPReUpload() {
        log.info("断点续传每30分钟执行-开始");
        try {
            // 查询出需要断点传输的数据
            List<SysFTPLogftp> breakpointTransmission = postMapper.getBreakpointTransmission();
            for (SysFTPLogftp sysFTPLog : breakpointTransmission) {
                // 遍历数据集合
                if(StringUtils.isNotBlank(sysFTPLog.getResourcePath()) && StringUtils.isNotBlank(sysFTPLog.getServerIp()) && sysFTPLog.getServerPort()!=0 && StringUtils.isNotBlank(sysFTPLog.getFtpName()) && StringUtils.isNotBlank(sysFTPLog.getFtpPassword()) && StringUtils.isNotBlank(sysFTPLog.getFtpDir()) && StringUtils.isNotBlank(sysFTPLog.getUserId()) && StringUtils.isNotBlank(sysFTPLog.getDownOrderId())){
                    ftpUtil.uploadFileBreakPoint(sysFTPLog.getResourcePath(),sysFTPLog.getServerIp(),sysFTPLog.getServerPort(),sysFTPLog.getFtpName(),sysFTPLog.getFtpPassword(),sysFTPLog.getFtpDir(),sysFTPLog.getUserId(),sysFTPLog.getDownOrderId());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("断点续传每30分钟执行-结束");
    }

    /**
     * 四.FTP登录账号手动下载，此程序做查询推送
     */
    //@Scheduled(cron = "0 0 15 * * ?")
    //@Scheduled(cron = "0 */1 * * * ?") //每10分钟执行
    @Scheduled(cron = "*/10 * * * * *")
    public void manualDownload() {
        log.info("FTP登录账号手动下载程序，每10分钟执行-开始 创建硬链接");
        try {
            // 查询需要推送硬链接的数据
            List<SysFTPConfigLeftJoinUser> sysFTPConfigLeftJoinUsers = postMapper.selectManualDownload();
            System.out.println(sysFTPConfigLeftJoinUsers.size());
            // 遍历数据集合
            for (SysFTPConfigLeftJoinUser sysFTPConfigLeftJoinUser : sysFTPConfigLeftJoinUsers) {
                // 非空判断
                if(StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getResourcePath()) && StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getFtpDir()) && StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getUserId()) && StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getUserName())){ // StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getServerIp()) && sysFTPConfigLeftJoinUser.getServerPort()!=0 && StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getFtpName()) && StringUtils.isNotBlank(sysFTPConfigLeftJoinUser.getFtpPassword()) &&
                    // 根据文件路径生成文件夹和硬链接
                    boolean status = ftpUtil.manualDownload(sysFTPConfigLeftJoinUser);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("FTP登录账号手动下载程序，每10分钟执行-结束 创建硬链接");
    }


    /**
     * 五.定时删除文件
     */
    //每天的0点、13点、18点、21点都执行一次
    @Scheduled(cron = " 0 0 0,13,18,21 * * ?")
/*    @Scheduled(cron = "0/20 * * * * ?")*/
    private void myTasks() {
        //查看所有配置删除项
        List<SysFileTimedDel> sysFileTimedDels = iSysFileTimedDelService.selectSysFileTimedDelList(new SysFileTimedDel());
        for (SysFileTimedDel sysFileTimedDel : sysFileTimedDels) {
            //循环执行定时产出方法
            DeleteExpiredFile.deleteExpiredFileTask(sysFileTimedDel.getSclj(),Integer.valueOf(sysFileTimedDel.getTs()));
        }
        /*DeleteExpiredFile.deleteExpiredFileTask("/cloud/ncfile/fail",1);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ncfile/success",1);
        DeleteExpiredFile.deleteExpiredFileTask("/ftpusr/ocean/RNF",3);
        DeleteExpiredFile.deleteExpiredFileTask("/ftpusr/ocean/NMF",3);
        //ftp用户目录
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/JDLadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/JSHadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/JSZadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/NMDadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/PFJadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/PSDadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/PZJadmin/cloud",3);
        DeleteExpiredFile.deleteExpiredFileTask("/cloud/ocean/user/PZJadmin/cloud",3);*/
        System.out.println("执行定时任务 " + LocalDateTime.now());
    }

    /**
     * 多线程
     */
    public void allocationNOPackage(List<SysFTPConfigLeftJoinUser> userList,Integer num){
        // 判断 userList 的长度设置线程数
        if(userList.size() > 0 && userList.size() < 11){
            // 对象传输1
            pageListOne(userList,num);
        } else if(userList.size() >10 && userList.size() < 21){
            // 集合传输2
            pageListTwo(userList,2,num);
        } else if(userList.size() >20 && userList.size() < 31){
            // 集合传输3
            pageListTwo(userList,3,num);
        } else if(userList.size() >30 && userList.size() < 41){
            // 集合传输4
            pageListTwo(userList,4,num);
        } else if(userList.size() >40 && userList.size() < 51){
            // 集合传输5
            pageListTwo(userList,5,num);
        } else if(userList.size() >50){
            // 集合传输6
            pageListTwo(userList,10,num);
        }
    }

    /**
     * 单线程
     */
    public void allocation(List<SysFTPConfigLeftJoinUser> userList,Integer num){
        pageListTwo(userList,30,num);
    }

    /**
     * 根据数据分配线程（对象）
     * @param userList 对象集合
     */
    public void pageListOne(List<SysFTPConfigLeftJoinUser> userList,Integer num) {
        for(int i=0;i<userList.size();i++){
            SysFTPConfigLeftJoinUser userEntityList = userList.get(i);
            Thread thread = new Thread(new DownloadFileTask(userEntityList,num));
            thread.start();//注意启动线程需要调用start()方法，不是run()方法
        }
    }

    /**
     * 根据数据分配线程（集合）
     * @param userList 对象集合
     * @param userCount 每页数
     */
    public void pageListTwo(List<SysFTPConfigLeftJoinUser> userList,int userCount,Integer num) {
        List<List<SysFTPConfigLeftJoinUser>> pageList = PageUtil.splitList(userList, userCount);
        for(int i=0;i<pageList.size();i++){
            List<SysFTPConfigLeftJoinUser> userEntityList = pageList.get(i);
            Thread thread = new Thread(new DownloadFileTaskTwo(userEntityList,num));
            thread.start();//注意启动线程需要调用start()方法，不是run()方法
        }
    }

    /**
     * 测试推送
     */
    //@Scheduled(cron = "0 */10 * * * ?")
    /*@Scheduled(cron = "0 55 11 * * ?")
    public void TestScheduledUploadFileFTP() {
        log.info("测试定时传输FTP数据-开始");
        try {
            List<SysFTPConfigLeftJoinUser> sysFTPConfigLeftJoinUsers = postMapper.selectDownOrderByDatePackageTest();
            // 开启多线程传输数据
            allocationNOPackage(sysFTPConfigLeftJoinUsers,1);
            FTPUtil ftpUtil = new FTPUtil();
            ftpUtil.readConfigFileForFTP("61.144.248.177", 21, "szhy131", "Szhy!@#123", "/cloud/ocean/NMF/china_seas/whole/NMF_BEN_DT_CS_grid/NMF_BEN_OSM_CSDT_202311010800_120001_SST_00_L0.nc", "/cloud/ocean", "2c90819f6cb7a5d7016edad4861e46ff","2c90819f6cb7a5d7016edad4861e46ff", 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("测试定时传输FTP-执行结束");
    }*/
}
